#ifndef MODULE_LOADER_H
#define MODULE_LOADER_H

#include <QObject>
#include <QLibrary>
#include <QMap>
#include <QString>
#include "module_interface.h"

// 前向声明
class QWidget;

// 模块加载器类，负责动态加载HMI和PLC库
class ModuleLoader : public QObject
{
    Q_OBJECT
public:
    explicit ModuleLoader(QObject *parent = nullptr);
    ~ModuleLoader();

    // 加载所有可用的模块库
    bool loadModules();
    
    // 通过字符串查找创建模块
    IModule* createModule(const QString& moduleName, QWidget* ui, ModbusManager* modbusManager, QObject* parent = nullptr);
    
    // 获取所有可用的模块名称
    QStringList getAvailableModules() const;
    
    // 检查模块是否可用
    bool isModuleAvailable(const QString& moduleName) const;

private:
    // 加载单个库文件
    bool loadLibrary(const QString& libraryPath, const QString& moduleName);
    
    // 清理资源
    void cleanup();

private:
    QMap<QString, QLibrary*> libraries_;           // 模块名称 -> 库对象
    QMap<QString, CreateModuleFunc> createFuncs_;  // 模块名称 -> 创建函数
    QMap<QString, CreateFactoryFunc> factoryFuncs_; // 模块名称 -> 工厂函数
};

#endif // MODULE_LOADER_H
